#ifndef TCPCLIENT_H
#define TCPCLIENT_H
// 连接服务器、收发消息、绘制
#include <QtGui>
#include <QTcpSocket>
#include <QWidget>
#include <QImage>

class TcpClient : public QWidget
{
    Q_OBJECT
    friend class DrawClient;

public:
    explicit TcpClient(QWidget *parent = nullptr);
    // 设定服务器信息和用户名
    void setServerInfo(QString ip, int port, QString name);
    bool getIsCurrentPainter() const;
    // 绘制线条
    void drawLine(const QPoint &endPoint);
    // 更改画板大小
    static void resizeImage(QImage *image, const QSize &newSize);
    // 绘图函数
    void paintEvent(QPaintEvent *event);
    // 鼠标按下事件
    void mousePressEvent(QMouseEvent *event);
    // 鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event);
    // 鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *event);
    // 更改窗口大小事件
    void resizeEvent(QResizeEvent *event);
    // 设置画笔颜色和粗细
    void setPenColor(const QColor &newPenColor);
    void setPenWidth(int newPenWidth);

private:
    QTcpSocket *clientSocket{};
    // 服务器地址和用户名
    QString serverAddress, username;
    // 服务器端口号
    int serverPort{};
    // 是否已连接
    bool isConnected;
    // 是否画家
    bool isCurrentPainter;
    // 是否正在绘制
    bool isDrawing;
    // 笔画粗细
    int penWidth{};
    // 笔画颜色
    QColor penColor;
    // 画板
    QImage *image;
    // 指针坐标
    QPoint lastPoint;
    // 当前是否正在游戏中
    bool isGamePlaying = false;

signals:
    // 有新消息
    void signalNewMsg(QString);
    // 有其他用户上线
    void signalNewUser(QString);
    // 计时
    void signalNewTime(QString);
    // 词语
    void signalNewWord(QString);
    // 有其他用户下线
    void signalUserLeft(int, QString);
    // 猜对词语
    void signalBeGuessed(QString);
    // 取消画家资格
    void signalCancelPainter();

private slots:
    // 连接服务器
    void connectToServer();
    // 断开连接
    void disconnectFromServer();
    /*
     * 消息处理函数，用参数定义消息类型，用分号切分消息内容
     * 用户名：1;username
     * 颜色、粗细和坐标：2;color;width;x;y;x;y;
     * 用户发言：3;username;word;
     * 清屏：4;
     * 发给画家的词语：5;word;
     * 切换画家：6;
     * 剩余时间：7;time;
     * 弃权消息：8;username;
     * 游戏结果：9;username;word;
     * 用户下线：0;number;username;   number表示用户在列表中的编号
     */
    void receiveMsg();

    // 消息类型 4、6
    void sendMsg(int type);
    // 消息类型 3、9
    void sendMsg(int type, const QString& name, const QString& word);
    // 消息类型 2
    void sendMsg(int type, QPoint start, QPoint end);
    // 消息类型 1、5、8
    void sendMsg(int type, const QString& name);
    // 清空画板
    void clearImage();
    // 将鼠标指针设为十字形
    void setPencilCursor();
    // 将鼠标指针设为橡皮擦
    void setEraserCursor();
};

#endif // TCPCLIENT_H
